package de.muyat.kablosuzizci.test_izsurucu;

import java.text.DecimalFormat;

import de.muyat.kablosuzizci.istemci.Ivme;
import de.muyat.kablosuzizci.istemci.Koordinat;
import de.muyat.kablosuzizci.istemci.Oryantasyon;
import de.muyat.kablosuzizci.istemci.Pozisyon;
import de.muyat.kablosuzizci.istemci.PozisyonSensoru;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

/**
 * IzSurucu kutuphanesinin nasil kullanilacagini gosteren ornek Android uygulamasi.
 * 
 * @author Dzhoshkun Ismail Shakir
 *
 */
public class AnaEkran extends Activity {
	private Button salter;
	private static final String BUTON_METNI_INAKTIF = "Baslat",
								BUTON_METNI_AKTIF = "Durdur";
	private static final int 	BUTON_RENGI_INAKTIF = Color.GRAY,
								BUTON_RENGI_AKTIF_SENSOR_VAR = Color.GREEN,
								BUTON_RENGI_AKTIF_SENSOR_YOK = Color.RED;
	private EditText 	xMetinAlani, yMetinAlani, zMetinAlani,
						azimuthMetinAlani, pitchMetinAlani, rollMetinAlani,
						ivmeXMetinAlani, ivmeYMetinAlani, ivmeZMetinAlani;
	private GuncellemeAracisi guncellemeAracisi = new GuncellemeAracisi();
	private static boolean pozisyonGuncelle;
	private static boolean sensorVar;
	private static Pozisyon guncelPozisyon = new Pozisyon(0, 0, 0, 0, 0, 0);
	private static Ivme guncelIvme = new Ivme(0, 0, 0);
	private static DecimalFormat degerFormatlayici = new DecimalFormat("000.00");
	
	/**
	 * Multitasking yaparken, arayuz bilesenlerini degistirmeye izin veren mekanizma.
	 * @author Dzhoshkun Ismail Shakir
	 *
	 */
	class GuncellemeAracisi extends Handler {
		@Override
		public void handleMessage(Message msg) {
			AnaEkran.this.arayuzuGuncelle();
		}
		
		/**
		 * 
		 * @param gecikmeSuresi bu kadar milisaniye uyuyacaktir bu araci
		 */
		public void uyu(long gecikmeSuresi) {
			this.removeMessages(0);
			sendMessageDelayed(obtainMessage(0), gecikmeSuresi);
		}
	}
	
	@Override
	protected void onCreate(Bundle kaydedilmisInstans) {
		super.onCreate(kaydedilmisInstans);
		setContentView(R.layout.activity_ana_ekran);
		salter = (Button) findViewById(R.id.button_pozisyon_ilkle);
		salter.setText(BUTON_METNI_INAKTIF);
		salter.setBackgroundColor(BUTON_RENGI_INAKTIF);
		
		xMetinAlani = (EditText) findViewById(R.id.editText_x);
		yMetinAlani = (EditText) findViewById(R.id.editText_y);
		zMetinAlani = (EditText) findViewById(R.id.editText_z);
		azimuthMetinAlani = (EditText) findViewById(R.id.editText_azimuth);
		pitchMetinAlani = (EditText) findViewById(R.id.editText_pitch);
		rollMetinAlani = (EditText) findViewById(R.id.editText_roll);
		ivmeXMetinAlani = (EditText) findViewById(R.id.editText_ivmeX);
		ivmeYMetinAlani = (EditText) findViewById(R.id.editText_ivmeY);
		ivmeZMetinAlani = (EditText) findViewById(R.id.editText_ivmeZ);
		
		pozisyonGuncelle = false;
		arayuzuGuncelle();
	}
	
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
	    super.onConfigurationChanged(newConfig);
	    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
	}
	
	/**
	 * Ilkeme butonuna basilinca bu metod cagrilir.
	 * @param gorunurEleman
	 */
	public void pozisyonHesaplamayiBaslat(View gorunurEleman) {
		if (!pozisyonGuncelle) {
			pozisyonGuncelle = true;
			salter.setText(BUTON_METNI_AKTIF);
			salter.setBackgroundColor(BUTON_RENGI_INAKTIF);
			
			Runnable pozisyonGuncelleyici = new Runnable() {
				
				@Override
				public void run() {
					PozisyonSensoru sensor = new PozisyonSensoru(AnaEkran.this);
					synchronized (AnaEkran.class) {
						sensorVar = sensor.sensorVarMi();
					}
					sensor.setPozisyon(new Koordinat(0, 0, 0), new Oryantasyon(0, 0, 0));
					sensor.basla();
					while (true) {
						synchronized (AnaEkran.class) {
							if (!pozisyonGuncelle)
								break;
							try {
								guncelPozisyon = sensor.guncelPozisyonuVer();
								guncelIvme = sensor.guncelIvmeyiVer();
							} catch (IllegalStateException e) {
								e.printStackTrace();
							}
						}
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					sensor.dur();
					sensor = null;
				}
			};
			new Thread(pozisyonGuncelleyici).start();
		}
		else {
			pozisyonGuncelle = false;
			salter.setText(BUTON_METNI_INAKTIF);
			salter.setBackgroundColor(BUTON_RENGI_INAKTIF);
		}
	}
	
	/**
	 * Arayuz guncelleme threadi, arayuzu guncellemek icin bu metodu kullanir.
	 */
	private void arayuzuGuncelle() {
		guncellemeAracisi.uyu(5000);
		synchronized (AnaEkran.class) {
			salter.setText(pozisyonGuncelle ? BUTON_METNI_AKTIF : BUTON_METNI_INAKTIF);
			salter.setBackgroundColor(pozisyonGuncelle ? (sensorVar ? BUTON_RENGI_AKTIF_SENSOR_VAR : BUTON_RENGI_AKTIF_SENSOR_YOK) : BUTON_RENGI_INAKTIF);
			xMetinAlani.setText(degerFormatlayici.format(guncelPozisyon.getX()/1000));
			yMetinAlani.setText(degerFormatlayici.format(guncelPozisyon.getY()/1000));
			zMetinAlani.setText(degerFormatlayici.format(guncelPozisyon.getZ()/1000));
			azimuthMetinAlani.setText(degerFormatlayici.format(Math.toDegrees(guncelPozisyon.getAzimuth())));
			pitchMetinAlani.setText(degerFormatlayici.format(Math.toDegrees(guncelPozisyon.getPitch())));
			rollMetinAlani.setText(degerFormatlayici.format(Math.toDegrees(guncelPozisyon.getRoll())));
			ivmeXMetinAlani.setText(degerFormatlayici.format(guncelIvme.getX()));
			ivmeYMetinAlani.setText(degerFormatlayici.format(guncelIvme.getY()));
			ivmeZMetinAlani.setText(degerFormatlayici.format(guncelIvme.getZ()));
		}
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_ana_ekran, menu);
		return true;
	}
}